home *** CD-ROM | disk | FTP | other *** search
-
- #include "kSanPlugIn.h"
- #include "OHSharedUtils.h"
- #include "OHApplicationPublic.h"
- #include "OHAEDescUtils.h"
- #include "OHFileUtils.h"
-
- OHList plugFileList;
-
- short loadPlugIn (kSanPlugFile *pf);
- short looksLikeAPlugin(FSSpec *plug);
-
- short kSanPlugFileAllocator(FSSpec *fs);
- short kSanPlugFileConstructor(kSanPlugFile *pf);
- void kSanPlugFileDestructor (kSanPlugFile *pf);
-
- short initClassPlugFile (void)
- {
- short err = noErr;
- initializeList (&plugFileList);
- return (err);
- }
-
- short kSanPlugFileAllocator(FSSpec *fs)
- {
- short err = noErr;
- kSanPlugFile *pf;
-
- pf = nilPointer;
- pf = (kSanPlugFile *)NewPtrClear (sizeof(kSanPlugFile));
- if (pf == nilPointer) err = true;
- else err = MemError();
- if (!err) err = kSanPlugFileConstructor (pf);
- if (!err)
- {
- pf->file.fs = *fs;
- err = useResFile(&pf->file);
- if ( !err )
- {
- err = OHStringSetR(&pf->name, kBaseResID);
- usePreviousResFile(&pf->file);
- err = loadPlugIn(pf);
-
- if (!err)
- {
- addToList (&plugFileList, (long) pf);
- }
- }
- }
- return (err);
- }
-
- void kSanPlugFileDeallocator(kSanPlugFile *pf)
- {
- kSanPlugFileDestructor ( pf);
- DisposePtr ((Ptr) pf);
- }
-
- short kSanPlugFileConstructor(kSanPlugFile *pf)
- {
- short err = noErr;
-
- OHFileConstructor (&pf->file);
- pf->loadUPP = nilPointer;
- initializeList (&pf->residentClasses);
- OHStringCreate(&pf->name); // get name
- return(err);
- }
- void kSanPlugFileDestructor (kSanPlugFile *pf)
- {
- if (pf->connID) CloseConnection(&pf->connID);
- if (pf->loadUPP != nilPointer) DisposeRoutineDescriptor(pf->loadUPP);
- OHFileDestructor (&pf->file);
- OHStringDispose(&pf->name);
- disposeList (&pf->residentClasses);
-
- }
- short loadPlugIn (kSanPlugFile *pf)
- {
- OSErr err = noErr;
- Ptr mainAddr = nil;
- Ptr symAddr = nil;
- Str255 errName;
- Str255 libName;
- CFragSymbolClass symClass;
-
- OHStringGetP (&pf->name, libName);
- err = GetSharedLibrary(libName, kPowerPCCFragArch, kPrivateCFragCopy,
- &pf->connID, &mainAddr, errName);
-
- if (!err) err = FindSymbol(pf->connID, "\pkSanPlugInInit", &symAddr, &symClass);
- if (!err)
- {
- pf->doAboutPlugIn = nilPointer;
- pf->loadUPP = nilPointer;
- pf->loadUPP = NewRoutineDescriptor((ProcPtr)symAddr, kShortOneStackPtrProc, GetCurrentISA());
- if (pf->loadUPP) err = CallUniversalProc(pf->loadUPP, kShortOneStackPtrProc, pf);
- }
- return err;
- }
- short looksLikeAPlugin(FSSpec *plugSpec)
- {
- OSType kSanType ; // could be kSan or kTwo
- OSType shlbType = 'shlb';
- short result = false;
- short err;
- FInfo fndrInfo;
-
- kSanType = OHOCID(globalAppObject);
- err = FSpGetFInfo(plugSpec, &fndrInfo);
- if (!err)
- {
- if ((fndrInfo.fdType == shlbType) && (fndrInfo.fdCreator == kSanType))
- {
- result = true;
- }
- }
- return (result);
- }
-
- short searchFilesForPlugInsCallback(AEDesc *nthDesc, void *dummy);
- short searchFilesForPlugInsCallback(AEDesc *nthDesc, void *dummy)
- {
- #pragma unused(dummy)
- short err = noErr;
- FSSpec plugInSpec;
- if ( nthDesc->descriptorType == typeFSS)
- {
- plugInSpec = (*(FSSpec *)(*nthDesc->dataHandle));
- if (looksLikeAPlugin (&plugInSpec)) kSanPlugFileAllocator(&plugInSpec);
- }
- return (err);
- }
-
- void disposeFoundPlugIns(void)
- {
- kSanPlugFile *pf;
- while (OHListCount( &plugFileList) >0)
- {
- pf = (kSanPlugFile *) popTopItem (&plugFileList);
- kSanPlugFileDeallocator(pf);
- }
- disposeList (&plugFileList);
- }
-
- short searchFilesForPlugIns(void)
- {
- short err = noErr;
- FSSpec plugInFolderSpec;
- FSSpec plugInSpec;
- AEDesc fsList = {typeNull, nilPointer};
-
- getAppSpec(&plugInFolderSpec);
- CTo255 ("plugins" , plugInFolderSpec.name );
- err = getListOfFilesInFolder(&plugInFolderSpec, &fsList);
- if (fsList.descriptorType == typeFSS)
- {
- plugInSpec = (*(FSSpec *)(*fsList.dataHandle));
- if (looksLikeAPlugin (&plugInSpec)) kSanPlugFileAllocator(&plugInSpec);
- }
- else if (fsList.descriptorType == typeAEList)
- {
- err = AEListEveryItemDoOneArg(&fsList, typeFSS, searchFilesForPlugInsCallback, 0L);
- }
- return (err);
- }